…………………………………………………………………………………………..

Background

Picture by Rebecca Tribelhorn

Picture by Rebecca Tribelhorn

The Seaside Sparrow is a grassland obligate species that is restricted to saltmarsh habitats along the Atlantic and Gulf coasts of the United States. These birds are saltmarsh specialists and the habitat they occupy is highly fragmented and non-contiguous throughout their range. The Seaside sparrow is a non-migratory Passerine species with the exception of the Ammospiza maritima maritima subspecies which is known to migrate south along the Atlantic coastline during the winter and return north in the spring.

There are currently seven described subspecies of Seaside Sparrow: A.m. maritima, A.m. macguilivraii, A.m. mirabilis, A.m. peninsulae, A.m. juncicola, A.m. fisheri, and A.m. sennetti. The current subspecies designation is based largely on plumage morphology, though there is a great deal of debate over the accuracy of these designations and a number of genetic examinations are underway to examine the relatedness of these subspecies. Existing literature has already determined that subspecies are more closely related to subspecies on the same coastline (Atlantic and Gulf), Leading to the acknowledgment of two coastal lineages of the Seaside Sparrow.

Image credit Stefan Woltmann

Image credit Stefan Woltmann

This research was conducted to examine if song or song elements in the song of the Seaside Sparrow vary geographically, and if observable variation aligns with current subspecies designations.

Geographic variation in song is common in temperate passerines, but previous studies exploring song variation in Seaside Sparrows have not examined song at a range-wide scale. We analyzed the song structure of nine subspecies of Seaside Sparrow to describe how song varies geographically and ask whether variation in song structure aligns with currently described subspecies designations. For this study we gathered songs from the collections of the Macaulay Library, Borror Institute of Sound, Florida Natural History Museum, and Xeno-Canto, and also recorded songs at several sites in Texas.

Seaside Sparrows have a song repertoire of between one and four songs and sing only a single song type. The song of the Seaside Sparrow has a distinctive two-part structure consisting of an introductory phrase, composed of a warble containing a variety of syllables, followed by a terminal buzz. Song components within the introductory phrase of the song are highly variable, while the terminal buzz is a consistent feature throughout the species range.

Eight descriptive measures of song were recorded for the introduction and the terminal buzz. We also recorded the total number of syllables in the introduction, and the rate at which the terminal buzz was delivered. Finally, each syllable from every song was categorized into one of six syllable types, then grouped by specific identity within each type.

Below are three spectogram showing the Seaside Sparrow song from three locations throughout its range. Each Spectogram has an associated audio file of the displayed song.

Using ANOVA and PCAs we explored if songs clustered geographically or by subspecies based on elements of song structure or syllable identity.

Range, collection sites, and distribution of song recordings

For this study I used a combination of field recordings and archived recordings from various digital archives. Below is a map showing the origin location of all of the recordings used for this project. For this first map songs are clustered by location and will separate out the farther the map is zoomed in. Additionally, clicking on a specific point will show which subspecies is associated with the song.

Measurements and song variables

For this analysis I recorded eight song variables for each the Seaside Sparrow songs in my data set. These variables were the Total Number of Syllables (SC), Introductory Phrase Duration (I_D), Terminal Buzz Duration (TB_D), Total Song Duration (S_D), Terminal Buzz Maximum Frequency (TB_MaF), Terminal Buzz Minumum Frequency (TB_MiF), Terminal Buzz Mean Frequency (TB_MeF), and Terminal Buzz Rate (TB_Pps).

Examination of variables for correlation

Using a Pearson’s correlation test I examined my variables for strong correlation in order to remove redundant variables from my dataset. To do this I looked for values greater than 0.80 correlation from within my variables. Only the Terminal Buzz Maximum Frequency and the Terminal Buzz Minimum Frequency had a correlation greater than 0.80. I removed Terminal Buzz Mean Frequency from my analysis. I also removed Total Song Duration from the analysis as differences in Introductory Phrase Duration and Terminal Buzz Duration will reflect differences in Total Song Duration and thus is a redundant variable for this analysis.

          SC  TB_D TB_MeF   S_D   I_D TB_Pps TB_MaF TB_MiF
SC      1.00 -0.04  -0.04  0.07  0.14   0.07  -0.06   0.06
TB_D   -0.04  1.00  -0.07  0.66 -0.37   0.00  -0.02  -0.15
TB_MeF -0.04 -0.07   1.00  0.07  0.18   0.02   0.94   0.26
S_D     0.07  0.66   0.07  1.00  0.46  -0.03   0.12  -0.13
I_D     0.14 -0.37   0.18  0.46  1.00  -0.04   0.17   0.03
TB_Pps  0.07  0.00   0.02 -0.03 -0.04   1.00   0.01   0.03
TB_MaF -0.06 -0.02   0.94  0.12  0.17   0.01   1.00  -0.08
TB_MiF  0.06 -0.15   0.26 -0.13  0.03   0.03  -0.08   1.00

n= 341 


P
       SC     TB_D   TB_MeF S_D    I_D    TB_Pps TB_MaF TB_MiF
SC            0.4537 0.4926 0.1763 0.0103 0.1778 0.2784 0.2807
TB_D   0.4537        0.1717 0.0000 0.0000 0.9447 0.6794 0.0041
TB_MeF 0.4926 0.1717        0.1902 0.0011 0.6599 0.0000 0.0000
S_D    0.1763 0.0000 0.1902        0.0000 0.5385 0.0298 0.0188
I_D    0.0103 0.0000 0.0011 0.0000        0.4984 0.0015 0.6306
TB_Pps 0.1778 0.9447 0.6599 0.5385 0.4984        0.8067 0.5487
TB_MaF 0.2784 0.6794 0.0000 0.0298 0.0015 0.8067        0.1207
TB_MiF 0.2807 0.0041 0.0000 0.0188 0.6306 0.5487 0.1207       

ANOVA between subspecies

Next, I ran an ANOVA on the remaining variables. Based on the P-values returned from this analysis, all of the remaining variables showed significant variation between subspecies groups.

Df Sum Sq Mean Sq F value Pr(>F)
SC 1 7.675273 7.675273 6.332090 0.0123254
TB_D 1 25.829456 25.829456 21.309267 0.0000056
I_D 1 28.222858 28.222858 23.283821 0.0000021
TB_Pps 1 36.172586 36.172586 29.842336 0.0000001
TB_MaF 1 196.411582 196.411582 162.039296 0.0000000
TB_MiF 1 5.191018 5.191018 4.282583 0.0392734
Residuals 334 404.849133 1.212123 NA NA

Principle component analysis: clustering by subspecies

Next I ran a PCA using the significant variables from the ANOVA to examine if songs were clustering by subspecies, based on significant song variables. Unfortunately little can be determined from this PCA plot other than that there is no clear separation by subspecies given the significant variables.

For each of the dimensions used to form the axis for the PCA plot a bar-plot was generated showing the contribution of each variable within the dimension. The red line on each of these plots represents the value that all variables would be at if they were contributing equally.

Subspecies boxplots

To more clearly visualize the variation between subspecies I constructed boxplots for each significant variable from the ANOVA. The subspecies in each plot are arranged along a longitudinal gradient with the westmost subspecies on the left and the east-most subspecies on the right. In this way a trendline can be fit to examine if there is a longitudinal gradient associated with any visible variation.

Using these plots we can see that variation is present in each variable. However, only the Total Number of Syllables, and the Terminal Buzz Maximum Frequency show clear separation between subspecies groups. We do see some slight longitudinal trends in several of the variables examined.

Syllable identification and distribution: localized and broadly dispersed syllables

The next step was to examine and describe syllable identities for each syllable for all songs in the dataset.

Each syllable was binned into one of six syllable groups: Buzz syllables, Complex syllables, Trill syllables, Whistle syllables, Whistle-buzz syllables, and Whistle-trill syllables. Once grouped by type, each syllable was measured and compared by shape to determine individual identities based on morphology, duration (sec), and frequency range (kHz). 215 syllables were described using this method.

I used a “minimum occurrence” threshold of four occurrences of a specific syllable within the dataset for the syllable to be included in the analysis. This was done to weed out possible outliers and improvisations. The threshold was determined by taking an average of the number of songs recorded at a given location and corroborated using a power analysis. Of the 215 described in the dataset, 67 syllables passed the minimum occurrence threshold and were used in the analysis.

I then plotted the resulting syllables based on their latitude and longitude, and colored them by the subspecies song that the syllable was recorded in. This was done to examine if syllables occurred in highly localized instances, restricted geographically to a small area or a single subspecies, or if the syllables were highly dispersed across the entire range of the Seaside Sparrow.

Below are examples of localized and dispersed syllables from within the data set, as well as a bar graph showing the percentage of localized and dispersed syllables in the dataset. We can see from this graph that only ~25% of the syllables were localized, while ~75% where dispersed.

Coastal lineages: how does changing perspective change the story?

From this point I wanted to see if a broader pattern better described the observable variation in the data set. To examine this I wanted to know: Does Geographic variation exist between the two coastal lineages of Seaside Sparrow subspecies?

First, I re-ran my initial ANOVA using the Atlantic and Gulf regions rather than subspecies groups to determine if the significance of my variables had changed based on this alternate method of grouping songs. Once songs were grouped by coastal lineage, the p-values of the Terminal Buzz Rate and Terminal Buzz Minimum Frequency were greater than 0.05 and removed for the next analysis.

Df Sum Sq Mean Sq F value Pr(>F)
SC 1 8.7918594 8.7918594 67.1375263 0.0000000
TB_D 1 3.7443647 3.7443647 28.5931987 0.0000002
I_D 1 5.5196288 5.5196288 42.1496989 0.0000000
TB_Pps 1 0.0000321 0.0000321 0.0002449 0.9875225
TB_MaF 1 12.5841172 12.5841172 96.0964530 0.0000000
TB_MiF 1 0.1378302 0.1378302 1.0525169 0.3056706
Residuals 334 43.7382966 0.1309530 NA NA

Coastal lineage principle component analysis

I re-constructed the PCA plot using the coastal lineages and, while there is still an area of overlap, there is a much clearer separation and clustering of data points between the two groups.

Additionally, I constructed boxplots of the significant variables to examine if clear separation existed between the two coastal lineages for each significant variable.

From these graphs we can see stronger separation between coastal lineages than between subspecies groups for each of the variables. In particular the Total number of Syllables and Terminal Buzz Maximum Frequency show strong separation.

Syllable accumulation

Finally, I wanted to look at the total accumulation of syllables determine if the 215 described syllables from my data set are a representative sampling of songs from throughout the range. In addition, I wanted to compare the rate of syllable accumulation between the two coastal lineages.

To do this I constructed an accumulation curve of syllables for the entire data set and overlaid it with an additional curve for each coastal lineage.

What this shows is an overall accumulation curve that has not leveled off. this indicates that more song sampling would likely yield additional syllables throughout the species range. Additionally we see that the Atlantic lineage accrues more syllables than the Gulf lineage at equal points on the graph. The Atlantic lineage also contains nearly as many syllables as the Gulf. These findings are interesting given that the Gulf lineage had a higher number of syllables per song. This would indicate that the Gulf lineage songs have a higher occurrence of repeat syllables in each song.

…………………………………………………………………………………………..

LS0tCnRpdGxlOiAiPGNlbnRlcj48Yj48dT5TZWFzaWRlIFNwYXJyb3cgKCpBbW1vc3BpemEgbWFyaXRpbWEqKSBnZW9ncmFwaGljIHZhcmlhdGlvbiBhbmQgc3Vic3BlY2llcyBzb25nIHN0cnVjdHVyZSBhbmFseXNpczwvdT48L2I+PC9jZW50ZXI+IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiB1bml0ZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCiMjIDx1PkJhY2tncm91bmQ8L3U+CgohW1BpY3R1cmUgYnkgUmViZWNjYSBUcmliZWxob3JuXShSX01hcmtfaW1hZ2UuanBnKQoKICBUaGUgU2Vhc2lkZSBTcGFycm93IGlzIGEgZ3Jhc3NsYW5kIG9ibGlnYXRlIHNwZWNpZXMgdGhhdCBpcyByZXN0cmljdGVkIHRvIHNhbHRtYXJzaCBoYWJpdGF0cyBhbG9uZyB0aGUgQXRsYW50aWMgYW5kIEd1bGYgY29hc3RzIG9mIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGVzZSBiaXJkcyBhcmUgc2FsdG1hcnNoIHNwZWNpYWxpc3RzIGFuZCB0aGUgaGFiaXRhdCB0aGV5IG9jY3VweSBpcyBoaWdobHkgZnJhZ21lbnRlZCBhbmQgbm9uLWNvbnRpZ3VvdXMgdGhyb3VnaG91dCB0aGVpciByYW5nZS4gVGhlIFNlYXNpZGUgc3BhcnJvdyBpcyBhIG5vbi1taWdyYXRvcnkgUGFzc2VyaW5lIHNwZWNpZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSAqQW1tb3NwaXphIG1hcml0aW1hIG1hcml0aW1hKiBzdWJzcGVjaWVzIHdoaWNoIGlzIGtub3duIHRvIG1pZ3JhdGUgc291dGggYWxvbmcgdGhlIEF0bGFudGljIGNvYXN0bGluZSBkdXJpbmcgdGhlIHdpbnRlciBhbmQgcmV0dXJuIG5vcnRoIGluIHRoZSBzcHJpbmcuIAoKICBUaGVyZSBhcmUgY3VycmVudGx5IHNldmVuIGRlc2NyaWJlZCBzdWJzcGVjaWVzIG9mIFNlYXNpZGUgU3BhcnJvdzogKkEubS4gbWFyaXRpbWEqLCAqQS5tLiBtYWNndWlsaXZyYWlpKiwgKkEubS4gbWlyYWJpbGlzKiwgKkEubS4gcGVuaW5zdWxhZSosICpBLm0uIGp1bmNpY29sYSosICpBLm0uIGZpc2hlcmkqLCBhbmQgKkEubS4gc2VubmV0dGkqLiBUaGUgY3VycmVudCBzdWJzcGVjaWVzIGRlc2lnbmF0aW9uIGlzIGJhc2VkIGxhcmdlbHkgb24gcGx1bWFnZSBtb3JwaG9sb2d5LCB0aG91Z2ggdGhlcmUgaXMgYSBncmVhdCBkZWFsIG9mIGRlYmF0ZSBvdmVyIHRoZSBhY2N1cmFjeSBvZiB0aGVzZSBkZXNpZ25hdGlvbnMgYW5kIGEgbnVtYmVyIG9mIGdlbmV0aWMgZXhhbWluYXRpb25zIGFyZSB1bmRlcndheSB0byBleGFtaW5lIHRoZSByZWxhdGVkbmVzcyBvZiB0aGVzZSBzdWJzcGVjaWVzLiBFeGlzdGluZyBsaXRlcmF0dXJlIGhhcyBhbHJlYWR5IGRldGVybWluZWQgdGhhdCBzdWJzcGVjaWVzIGFyZSBtb3JlIGNsb3NlbHkgcmVsYXRlZCB0byBzdWJzcGVjaWVzIG9uIHRoZSBzYW1lIGNvYXN0bGluZSAoQXRsYW50aWMgYW5kIEd1bGYpLCBMZWFkaW5nIHRvIHRoZSBhY2tub3dsZWRnbWVudCBvZiB0d28gPGI+Y29hc3RhbCBsaW5lYWdlczwvYj4gb2YgdGhlIFNlYXNpZGUgU3BhcnJvdy4KCiFbSW1hZ2UgY3JlZGl0IFN0ZWZhbiBXb2x0bWFubl0oU0VTUCBjdXJyZW50IHNzcCBtYXAgZXh0aW5jdC5qcGcpCgogIFRoaXMgcmVzZWFyY2ggd2FzIGNvbmR1Y3RlZCB0byBleGFtaW5lIGlmIHNvbmcgb3Igc29uZyBlbGVtZW50cyBpbiB0aGUgc29uZyBvZiB0aGUgU2Vhc2lkZSBTcGFycm93IHZhcnkgZ2VvZ3JhcGhpY2FsbHksIGFuZCBpZiBvYnNlcnZhYmxlIHZhcmlhdGlvbiBhbGlnbnMgd2l0aCBjdXJyZW50IHN1YnNwZWNpZXMgZGVzaWduYXRpb25zLgogIAogIEdlb2dyYXBoaWMgdmFyaWF0aW9uIGluIHNvbmcgaXMgY29tbW9uIGluIHRlbXBlcmF0ZSBwYXNzZXJpbmVzLCBidXQgcHJldmlvdXMgc3R1ZGllcyBleHBsb3Jpbmcgc29uZyB2YXJpYXRpb24gaW4gU2Vhc2lkZSBTcGFycm93cyBoYXZlIG5vdCBleGFtaW5lZCBzb25nIGF0IGEgcmFuZ2Utd2lkZSBzY2FsZS4gV2UgYW5hbHl6ZWQgdGhlIHNvbmcgc3RydWN0dXJlIG9mIG5pbmUgc3Vic3BlY2llcyBvZiBTZWFzaWRlIFNwYXJyb3cgdG8gZGVzY3JpYmUgaG93IHNvbmcgdmFyaWVzIGdlb2dyYXBoaWNhbGx5IGFuZCBhc2sgd2hldGhlciB2YXJpYXRpb24gaW4gc29uZyBzdHJ1Y3R1cmUgYWxpZ25zIHdpdGggY3VycmVudGx5IGRlc2NyaWJlZCBzdWJzcGVjaWVzIGRlc2lnbmF0aW9ucy4gRm9yIHRoaXMgc3R1ZHkgd2UgZ2F0aGVyZWQgc29uZ3MgZnJvbSB0aGUgY29sbGVjdGlvbnMgb2YgdGhlIE1hY2F1bGF5IExpYnJhcnksIEJvcnJvciBJbnN0aXR1dGUgb2YgU291bmQsIEZsb3JpZGEgTmF0dXJhbCBIaXN0b3J5IE11c2V1bSwgYW5kIFhlbm8tQ2FudG8sIGFuZCBhbHNvIHJlY29yZGVkIHNvbmdzIGF0IHNldmVyYWwgc2l0ZXMgaW4gVGV4YXMuCiAgCiAgU2Vhc2lkZSBTcGFycm93cyBoYXZlIGEgc29uZyByZXBlcnRvaXJlIG9mIGJldHdlZW4gb25lIGFuZCBmb3VyIHNvbmdzIGFuZCBzaW5nIG9ubHkgYSBzaW5nbGUgc29uZyB0eXBlLiBUaGUgc29uZyBvZiB0aGUgU2Vhc2lkZSBTcGFycm93IGhhcyBhIGRpc3RpbmN0aXZlIHR3by1wYXJ0IHN0cnVjdHVyZSBjb25zaXN0aW5nIG9mIGFuIGludHJvZHVjdG9yeSBwaHJhc2UsIGNvbXBvc2VkIG9mIGEgd2FyYmxlIGNvbnRhaW5pbmcgYSB2YXJpZXR5IG9mIHN5bGxhYmxlcywgZm9sbG93ZWQgYnkgYSB0ZXJtaW5hbCBidXp6LiBTb25nIGNvbXBvbmVudHMgd2l0aGluIHRoZSBpbnRyb2R1Y3RvcnkgcGhyYXNlIG9mIHRoZSBzb25nIGFyZSBoaWdobHkgdmFyaWFibGUsIHdoaWxlIHRoZSB0ZXJtaW5hbCBidXp6IGlzIGEgY29uc2lzdGVudCBmZWF0dXJlIHRocm91Z2hvdXQgdGhlIHNwZWNpZXMgcmFuZ2UuIAogIAogIEVpZ2h0IGRlc2NyaXB0aXZlIG1lYXN1cmVzIG9mIHNvbmcgd2VyZSByZWNvcmRlZCBmb3IgdGhlIGludHJvZHVjdGlvbiBhbmQgdGhlIHRlcm1pbmFsIGJ1enouIFdlIGFsc28gcmVjb3JkZWQgdGhlIHRvdGFsIG51bWJlciBvZiBzeWxsYWJsZXMgaW4gdGhlIGludHJvZHVjdGlvbiwgYW5kIHRoZSByYXRlIGF0IHdoaWNoIHRoZSB0ZXJtaW5hbCBidXp6IHdhcyBkZWxpdmVyZWQuIEZpbmFsbHksIGVhY2ggc3lsbGFibGUgZnJvbSBldmVyeSBzb25nIHdhcyBjYXRlZ29yaXplZCBpbnRvIG9uZSBvZiBzaXggc3lsbGFibGUgdHlwZXMsIHRoZW4gZ3JvdXBlZCBieSBzcGVjaWZpYyBpZGVudGl0eSB3aXRoaW4gZWFjaCB0eXBlLgogIAogIEJlbG93IGFyZSB0aHJlZSBzcGVjdG9ncmFtIHNob3dpbmcgdGhlIFNlYXNpZGUgU3BhcnJvdyBzb25nIGZyb20gdGhyZWUgbG9jYXRpb25zIHRocm91Z2hvdXQgaXRzIHJhbmdlLiBFYWNoIFNwZWN0b2dyYW0gaGFzIGFuIGFzc29jaWF0ZWQgYXVkaW8gZmlsZSBvZiB0aGUgZGlzcGxheWVkIHNvbmcuIAogIAohW10oU29uZyBleGFtcGxlLnBuZykgIVtTb25nIEV4YW1wbGVdKFNvbmcgRXhhbXBsZS53YXYpICFbXShTb25nIGV4YW1wbGUgMi5wbmcpICFbU29uZyBFeGFtcGxlXShTb25nIEV4YW1wbGUgMi53YXYpICFbXShTb25nIGV4YW1wbGUgMy5wbmcpICFbU29uZyBFeGFtcGxlXShTb25nIEV4YW1wbGUgMy53YXYpCgogIFVzaW5nIEFOT1ZBIGFuZCBQQ0FzIHdlIGV4cGxvcmVkIGlmIHNvbmdzIGNsdXN0ZXJlZCBnZW9ncmFwaGljYWxseSBvciBieSBzdWJzcGVjaWVzIGJhc2VkIG9uIGVsZW1lbnRzIG9mIHNvbmcgc3RydWN0dXJlIG9yIHN5bGxhYmxlIGlkZW50aXR5LiAgCiAgCiMjIDx1PlJhbmdlLCBjb2xsZWN0aW9uIHNpdGVzLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHNvbmcgcmVjb3JkaW5nczwvdT4KCiAgRm9yIHRoaXMgc3R1ZHkgSSB1c2VkIGEgY29tYmluYXRpb24gb2YgZmllbGQgcmVjb3JkaW5ncyBhbmQgYXJjaGl2ZWQgcmVjb3JkaW5ncyBmcm9tIHZhcmlvdXMgZGlnaXRhbCBhcmNoaXZlcy4gQmVsb3cgaXMgYSBtYXAgc2hvd2luZyB0aGUgb3JpZ2luIGxvY2F0aW9uIG9mIGFsbCBvZiB0aGUgcmVjb3JkaW5ncyB1c2VkIGZvciB0aGlzIHByb2plY3QuIEZvciB0aGlzIGZpcnN0IG1hcCBzb25ncyBhcmUgY2x1c3RlcmVkIGJ5IGxvY2F0aW9uIGFuZCB3aWxsIHNlcGFyYXRlIG91dCB0aGUgZmFydGhlciB0aGUgbWFwIGlzIHpvb21lZCBpbi4gQWRkaXRpb25hbGx5LCBjbGlja2luZyBvbiBhIHNwZWNpZmljIHBvaW50IHdpbGwgc2hvdyB3aGljaCBzdWJzcGVjaWVzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29uZy4gIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KU29uZ19EYXRhIDwtIHJlYWRfZXhjZWwoIlNvbmctRGF0YV92Ny54bHN4IiwgCiAgICBzaGVldCA9ICJNYWluIERhdGEgU2hlZXQiKSAlPiUgc2xpY2UoMTE6NDI0KQoKCnBhbCA8LSBjb2xvckZhY3RvcihjKCJwaW5rIiwicmVkIiwib3JhbmdlIiwieWVsbG93IiwiZ3JlZW4iLCJibHVlIiwicHVycGxlIiksIGRvbWFpbiA9IGMoInNlbm5ldHRpIiwiZmlzaGVyaSIsImp1bmNpY29sYSIsInBlbmluc3VsYWUiLCJtaXJhYmlsaXMiLCJtYWNnaWxsaXZyYWlpIiwibWFyaXRpbWEiKSkKCmxlYWZsZXQoU29uZ19EYXRhKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUgYWRkTWFya2Vycyh+TG9uZ2l0dWRlLCB+TGF0aXR1ZGUsIHBvcHVwID0gU29uZ19EYXRhJFN1YnNwZWNpZXMsIGxhYmVsID0gU29uZ19EYXRhJFN1c2JwZWNpZXMsIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkKIApgYGAKCiMjIDx1Pk1lYXN1cmVtZW50cyBhbmQgc29uZyB2YXJpYWJsZXM8L3U+CgogIEZvciB0aGlzIGFuYWx5c2lzIEkgcmVjb3JkZWQgZWlnaHQgc29uZyB2YXJpYWJsZXMgZm9yIGVhY2ggdGhlIFNlYXNpZGUgU3BhcnJvdyBzb25ncyBpbiBteSBkYXRhIHNldC4gVGhlc2UgdmFyaWFibGVzIHdlcmUgdGhlIDxiPlRvdGFsIE51bWJlciBvZiBTeWxsYWJsZXMgKFNDKTwvYj4sIDxiPkludHJvZHVjdG9yeSBQaHJhc2UgRHVyYXRpb24gKElfRCk8L2I+LCA8Yj5UZXJtaW5hbCBCdXp6IER1cmF0aW9uIChUQl9EKTwvYj4sIDxiPlRvdGFsIFNvbmcgRHVyYXRpb24gKFNfRCk8L2I+LCA8Yj5UZXJtaW5hbCBCdXp6IE1heGltdW0gRnJlcXVlbmN5IChUQl9NYUYpPC9iPiwgPGI+VGVybWluYWwgQnV6eiBNaW51bXVtIEZyZXF1ZW5jeSAoVEJfTWlGKTwvYj4sIDxiPlRlcm1pbmFsIEJ1enogTWVhbiBGcmVxdWVuY3kgKFRCX01lRik8L2I+LCBhbmQgPGI+VGVybWluYWwgQnV6eiBSYXRlIChUQl9QcHMpPC9iPi4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dmb3J0aWZ5KQpsaWJyYXJ5KHB3cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkobGVhZmxldCkKU0FDX3JlZHVjZWQgPC0gcmVhZF9leGNlbCgiU0FDX3JlZHVjZWQueGxzeCIpCk11bHRpX3ZhcmlhdGVfcmVkdWNlZCA8LSByZWFkX2V4Y2VsKCJNdWx0aS12YXJpYXRlX3JlZHVjZWQueGxzeCIpCmxvY2FsX2Rpc3BlcnNlZF9jb3VudHMgPC0gcmVhZF9leGNlbCgibG9jYWxfZGlzcGVyc2VkX2NvdW50cy54bHN4IikKU3lsbGFibGVfYWNjdW0gPC0gcmVhZF9leGNlbCgiU3lsbGFibGVfYWNjdW0ueGxzeCIpCmBgYAoKIyMgPHU+RXhhbWluYXRpb24gb2YgdmFyaWFibGVzIGZvciBjb3JyZWxhdGlvbjwvdT4KCiAgVXNpbmcgYSBQZWFyc29uJ3MgY29ycmVsYXRpb24gdGVzdCBJIGV4YW1pbmVkIG15IHZhcmlhYmxlcyBmb3Igc3Ryb25nIGNvcnJlbGF0aW9uIGluIG9yZGVyIHRvIHJlbW92ZSByZWR1bmRhbnQgdmFyaWFibGVzIGZyb20gbXkgZGF0YXNldC4gVG8gZG8gdGhpcyBJIGxvb2tlZCBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjgwIGNvcnJlbGF0aW9uIGZyb20gd2l0aGluIG15IHZhcmlhYmxlcy4gT25seSB0aGUgPGI+VGVybWluYWwgQnV6eiBNYXhpbXVtIEZyZXF1ZW5jeTwvYj4gYW5kIHRoZSA8Yj5UZXJtaW5hbCBCdXp6IE1pbmltdW0gRnJlcXVlbmN5PC9iPiBoYWQgYSBjb3JyZWxhdGlvbiBncmVhdGVyIHRoYW4gMC44MC4gSSByZW1vdmVkIDxiPlRlcm1pbmFsIEJ1enogTWVhbiBGcmVxdWVuY3k8L2I+IGZyb20gbXkgYW5hbHlzaXMuIEkgYWxzbyByZW1vdmVkIDxiPlRvdGFsIFNvbmcgRHVyYXRpb248L2I+IGZyb20gdGhlIGFuYWx5c2lzIGFzIGRpZmZlcmVuY2VzIGluIDxiPkludHJvZHVjdG9yeSBQaHJhc2UgRHVyYXRpb248L2I+IGFuZCA8Yj5UZXJtaW5hbCBCdXp6IER1cmF0aW9uPC9iPiB3aWxsIHJlZmxlY3QgZGlmZmVyZW5jZXMgaW4gPGI+VG90YWwgU29uZyBEdXJhdGlvbjwvYj4gYW5kIHRodXMgaXMgYSByZWR1bmRhbnQgdmFyaWFibGUgZm9yIHRoaXMgYW5hbHlzaXMuCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJhc2ljLjEgPC0gU0FDX3JlZHVjZWQgJT4lIHNlbGVjdCg2OjEzKSAlPiUgbmEub21pdCgpCgpsaWJyYXJ5KCJIbWlzYyIpCgpyZXMyIDwtIHJjb3JyKGFzLm1hdHJpeChCYXNpYy4xKSkKcmVzMiAKCmBgYAoKIyMgPHU+QU5PVkEgYmV0d2VlbiBzdWJzcGVjaWVzPC91PiAKCiAgTmV4dCwgSSByYW4gYW4gQU5PVkEgb24gdGhlIHJlbWFpbmluZyB2YXJpYWJsZXMuIEJhc2VkIG9uIHRoZSBQLXZhbHVlcyByZXR1cm5lZCBmcm9tIHRoaXMgYW5hbHlzaXMsIGFsbCBvZiB0aGUgcmVtYWluaW5nIHZhcmlhYmxlcyBzaG93ZWQgc2lnbmlmaWNhbnQgdmFyaWF0aW9uIGJldHdlZW4gc3Vic3BlY2llcyBncm91cHMuCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCkJhc2ljMSA8LSBCYXNpYyAlPiUgbmEub21pdCgpCgpsbV9iYXNpYyA8LSBsbShTdWJzcGVjaWVzX2NvZGUgfiBTQyArIFRCX0QgKyBJX0QgKyBUQl9QcHMgKyBUQl9NYUYgKyBUQl9NaUYsIGRhdGEgPSBCYXNpYzEpCgphLmxtLmJhc2ljIDwtIGFub3ZhKGxtX2Jhc2ljKQoKYS5sbS5iYXNpYyAlPiUga2FibGUoKSAlPiUga2FibGVfc3R5bGluZygpCmBgYAoKIyMgPHU+UHJpbmNpcGxlIGNvbXBvbmVudCBhbmFseXNpczogY2x1c3RlcmluZyBieSBzdWJzcGVjaWVzPC91PgoKICBOZXh0IEkgcmFuIGEgUENBIHVzaW5nIHRoZSBzaWduaWZpY2FudCB2YXJpYWJsZXMgZnJvbSB0aGUgQU5PVkEgdG8gZXhhbWluZSBpZiBzb25ncyB3ZXJlIGNsdXN0ZXJpbmcgYnkgc3Vic3BlY2llcywgYmFzZWQgb24gc2lnbmlmaWNhbnQgc29uZyB2YXJpYWJsZXMuIFVuZm9ydHVuYXRlbHkgbGl0dGxlIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhpcyBQQ0EgcGxvdCBvdGhlciB0aGFuIHRoYXQgdGhlcmUgaXMgbm8gY2xlYXIgc2VwYXJhdGlvbiBieSBzdWJzcGVjaWVzIGdpdmVuIHRoZSBzaWduaWZpY2FudCB2YXJpYWJsZXMuCgogIEZvciBlYWNoIG9mIHRoZSBkaW1lbnNpb25zIHVzZWQgdG8gZm9ybSB0aGUgYXhpcyBmb3IgdGhlIFBDQSBwbG90IGEgYmFyLXBsb3Qgd2FzIGdlbmVyYXRlZCBzaG93aW5nIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCB2YXJpYWJsZSB3aXRoaW4gdGhlIGRpbWVuc2lvbi4gVGhlIHJlZCBsaW5lIG9uIGVhY2ggb2YgdGhlc2UgcGxvdHMgcmVwcmVzZW50cyB0aGUgdmFsdWUgdGhhdCBhbGwgdmFyaWFibGVzIHdvdWxkIGJlIGF0IGlmIHRoZXkgd2VyZSBjb250cmlidXRpbmcgZXF1YWxseS4gIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KCJkZXZ0b29scyIpCmxpYnJhcnkoImZhY3RvZXh0cmEiKQpsaWJyYXJ5KGUxMDcxKQpyZXF1aXJlKGNhcmV0KQoKQmFzaWMgPC0gQmFzaWMgJT4lIG5hLm9taXQoKQpCYXNpY18xIDwtIEJhc2ljICU+JSBzZWxlY3QoNiw3LDEwOjEzKQoKc3NwLnBjYTEgPC0gcHJjb21wKEJhc2ljXzEsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKCnBjYS5wbG90MSA8LSBmdml6X3BjYV9iaXBsb3Qoc3NwLnBjYTEsIGxhYmVsID0gInZhciIsIGF4ZXMgPSBjKDEsIDIpLCBnZW9tID0gYygicG9pbnQiLCAidGV4dCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBCYXNpYyRTdWJzcGVjaWVzLCBhZGRFbGxpcHNlcyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2UubGV2ZWwgPSAwLjk1KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJmaXNoZXJpIiA9ICIjNURDODYzRkYiLCAic2VubmV0dGkiID0gIiNCNERFMkNGRiIsICJqdW5jaWNvbGEiID0gIiM0NDAxNTRGRiIsICJwZW5pbnN1bGFlIiA9ICIjMjE5MDhDRkYiLCAibWFyaXRpbWEiID0gIiMzQjUyOEJGRiIpKSsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpwcmludChwY2EucGxvdDEpCgpkaW0xIDwtIGZ2aXpfY29udHJpYihzc3AucGNhMSwgY2hvaWNlPSJ2YXIiLCBheGVzPTEpK2xhYnModGl0bGU9IkNvbnRyaWJ1dGlvbnMgdG8gRGltZW5zaW9uIDEgKHgtYXhpcykiKSsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmRpbTIgPC0gZnZpel9jb250cmliKHNzcC5wY2ExLCBjaG9pY2U9InZhciIsIGF4ZXM9MikrbGFicyh0aXRsZT0iQ29udHJpYnV0aW9ucyB0byBEaW1lbnNpb24gMiAoeS1heGlzKSIpKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKZ3JpZC5hcnJhbmdlKGRpbTEsIGRpbTIsIG5yb3cgPSAxLCB0b3AgPSAiVmFyaWJsZSBXZWlnaHRzIFdpdGhpbiBQcmluY2lwbGUgQ29tcG9uZW50cyIpCmBgYAoKIyMgPHU+U3Vic3BlY2llcyBib3hwbG90czwvdT4KCiAgVG8gbW9yZSBjbGVhcmx5IHZpc3VhbGl6ZSB0aGUgdmFyaWF0aW9uIGJldHdlZW4gc3Vic3BlY2llcyBJIGNvbnN0cnVjdGVkIGJveHBsb3RzIGZvciBlYWNoIHNpZ25pZmljYW50IHZhcmlhYmxlIGZyb20gdGhlIEFOT1ZBLiBUaGUgc3Vic3BlY2llcyBpbiBlYWNoIHBsb3QgYXJlIGFycmFuZ2VkIGFsb25nIGEgbG9uZ2l0dWRpbmFsIGdyYWRpZW50IHdpdGggdGhlIHdlc3Rtb3N0IHN1YnNwZWNpZXMgb24gdGhlIGxlZnQgYW5kIHRoZSBlYXN0LW1vc3Qgc3Vic3BlY2llcyBvbiB0aGUgcmlnaHQuIEluIHRoaXMgd2F5IGEgdHJlbmRsaW5lIGNhbiBiZSBmaXQgdG8gZXhhbWluZSBpZiB0aGVyZSBpcyBhIGxvbmdpdHVkaW5hbCBncmFkaWVudCBhc3NvY2lhdGVkIHdpdGggYW55IHZpc2libGUgdmFyaWF0aW9uLiAgCgogIFVzaW5nIHRoZXNlIHBsb3RzIHdlIGNhbiBzZWUgdGhhdCB2YXJpYXRpb24gaXMgcHJlc2VudCBpbiBlYWNoIHZhcmlhYmxlLiBIb3dldmVyLCBvbmx5IHRoZSA8Yj5Ub3RhbCBOdW1iZXIgb2YgU3lsbGFibGVzPC9iPiwgYW5kIHRoZSA8Yj5UZXJtaW5hbCBCdXp6IE1heGltdW0gRnJlcXVlbmN5PC9iPiBzaG93IGNsZWFyIHNlcGFyYXRpb24gYmV0d2VlbiBzdWJzcGVjaWVzIGdyb3Vwcy4gV2UgZG8gc2VlIHNvbWUgc2xpZ2h0IGxvbmdpdHVkaW5hbCB0cmVuZHMgaW4gc2V2ZXJhbCBvZiB0aGUgdmFyaWFibGVzIGV4YW1pbmVkLiAgCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJhc2ljIDwtIFNBQ19yZWR1Y2VkCgpCYXNpYyRTdWJzcGVjaWVzIDwtIGZhY3RvcihCYXNpYyRTdWJzcGVjaWVzLCBsZXZlbHMgPSBjKCdzZW5uZXR0aScsJ2Zpc2hlcmknLCdqdW5jaWNvbGEnLCdwZW5pbnN1bGFlJywnbWFyaXRpbWEnKSwgb3JkZXJlZCA9IFRSVUUpCgpiMSA8LSBnZ3Bsb3QoQmFzaWMsIGFlcyh4PVN1YnNwZWNpZXMsIHk9U0MpKSArIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IEJhc2ljJFN1YnNwZWNpZXMpKSsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB4bGFiKCJTdWJzcGVjaWVzIikgKyB5bGFiKCJTeWxsYWJsZSBDb3VudCIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZmlzaGVyaSIgPSAiIzVEQzg2M0ZGIiwgInNlbm5ldHRpIiA9ICIjQjRERTJDRkYiLCAianVuY2ljb2xhIiA9ICIjNDQwMTU0RkYiLCAicGVuaW5zdWxhZSIgPSAiIzIxOTA4Q0ZGIiwgIm1hcml0aW1hIiA9ICIjM0I1MjhCRkYiKSkKYjIgPC0gZ2dwbG90KEJhc2ljLCBhZXMoeD1TdWJzcGVjaWVzLCB5PVRCX0QpKSArIAogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IEJhc2ljJFN1YnNwZWNpZXMpKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgeGxhYigiU3Vic3BlY2llcyIpICsgeWxhYigiVGVybWluYWwgQnV6eiBEdXJhdGlvbiAoc2VjKSIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZmlzaGVyaSIgPSAiIzVEQzg2M0ZGIiwgInNlbm5ldHRpIiA9ICIjQjRERTJDRkYiLCAianVuY2ljb2xhIiA9ICIjNDQwMTU0RkYiLCAicGVuaW5zdWxhZSIgPSAiIzIxOTA4Q0ZGIiwgIm1hcml0aW1hIiA9ICIjM0I1MjhCRkYiKSkKYjMgPC0gZ2dwbG90KEJhc2ljLCBhZXMoeD1TdWJzcGVjaWVzLCB5PUlfRCkpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gQmFzaWMkU3Vic3BlY2llcykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB4bGFiKCJTdWJzcGVjaWVzIikgKyB5bGFiKCJJbmRyb2R1Y3RvcnkgcGhyYXNlIGR1cmF0aW9uIChzZWMpIikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmaXNoZXJpIiA9ICIjNURDODYzRkYiLCAic2VubmV0dGkiID0gIiNCNERFMkNGRiIsICJqdW5jaWNvbGEiID0gIiM0NDAxNTRGRiIsICJwZW5pbnN1bGFlIiA9ICIjMjE5MDhDRkYiLCAibWFyaXRpbWEiID0gIiMzQjUyOEJGRiIpKQpiNCA8LSBnZ3Bsb3QoQmFzaWMsIGFlcyh4PVN1YnNwZWNpZXMsIHk9VEJfUHBzKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBCYXNpYyRTdWJzcGVjaWVzKSkgKyB0aGVtZV9idygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHhsYWIoIlN1YnNwZWNpZXMiKSArIHlsYWIoIlRlcm1pbmFsIEJ1enogUmF0ZSAocGVha3Mvc2VjKSIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZmlzaGVyaSIgPSAiIzVEQzg2M0ZGIiwgInNlbm5ldHRpIiA9ICIjQjRERTJDRkYiLCAianVuY2ljb2xhIiA9ICIjNDQwMTU0RkYiLCAicGVuaW5zdWxhZSIgPSAiIzIxOTA4Q0ZGIiwgIm1hcml0aW1hIiA9ICIjM0I1MjhCRkYiKSkKYjUgPC0gZ2dwbG90KEJhc2ljLCBhZXMoeD1TdWJzcGVjaWVzLCB5PVRCX01hRikpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gQmFzaWMkU3Vic3BlY2llcykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB4bGFiKCJTdWJzcGVjaWVzIikgKyB5bGFiKCJUZXJtaW5hbCBCdXp6IE1heGltdW0gRnJlcXVlbmN5IChrSHopIikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmaXNoZXJpIiA9ICIjNURDODYzRkYiLCAic2VubmV0dGkiID0gIiNCNERFMkNGRiIsICJqdW5jaWNvbGEiID0gIiM0NDAxNTRGRiIsICJwZW5pbnN1bGFlIiA9ICIjMjE5MDhDRkYiLCAibWFyaXRpbWEiID0gIiMzQjUyOEJGRiIpKQpiNiA8LSBnZ3Bsb3QoQmFzaWMsIGFlcyh4PVN1YnNwZWNpZXMsIHk9VEJfTWlGKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBCYXNpYyRTdWJzcGVjaWVzKSkgKyB0aGVtZV9idygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHhsYWIoIlN1YnNwZWNpZXMiKSArIHlsYWIoIlRlcm1pbmFsIEJ1enogTWluaW11bSBGcmVxdWVuY3kgKGtIeikiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZpc2hlcmkiID0gIiM1REM4NjNGRiIsICJzZW5uZXR0aSIgPSAiI0I0REUyQ0ZGIiwgImp1bmNpY29sYSIgPSAiIzQ0MDE1NEZGIiwgInBlbmluc3VsYWUiID0gIiMyMTkwOENGRiIsICJtYXJpdGltYSIgPSAiIzNCNTI4QkZGIikpCgpCMSA8LSBiMSArIGdndGl0bGUoIk51bWJlciBvZiBTeWxsYWJsZXMiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuMSwgYWxwaGE9MC45KSArZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RkFMU0UsIGNvbG9yPSJyZWQiLCBhZXMoZ3JvdXA9MSkpCkIyIDwtIGIyICsgZ2d0aXRsZSgiVGVybWluYWwgQnV6eiBEdXJhdGlvbiIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICAgIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC4xLCBhbHBoYT0wLjkpICtnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZT1GQUxTRSwgY29sb3I9InJlZCIsIGFlcyhncm91cD0xKSkKQjMgPC0gYjMgKyBnZ3RpdGxlKCJJbmRyb2R1Y3RvcnkgUGhyYXNlIER1cmF0aW9uIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjEsIGFscGhhPTAuOSkgK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFLCBjb2xvcj0icmVkIiwgYWVzKGdyb3VwPTEpKQpCNCA8LSBiNCArIGdndGl0bGUoIlRlcm1pbmFsIEJ1enogUmF0ZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICAgIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC4xLCBhbHBoYT0wLjkpICtnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZT1GQUxTRSwgY29sb3I9InJlZCIsIGFlcyhncm91cD0xKSkKQjUgPC0gYjUgKyBnZ3RpdGxlKCJUZXJtaW5hbCBCdXp6IE1heGltdW0gRnJlcXVlbmN5IikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICAgZ2VvbV9qaXR0ZXIoY29sb3I9ImJsYWNrIiwgc2l6ZT0wLjEsIGFscGhhPTAuOSkgK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlPUZBTFNFLCBjb2xvcj0icmVkIiwgYWVzKGdyb3VwPTEpKQpCNiA8LSBiNiArIGdndGl0bGUoIlRlcm1pbmFsIEJ1enogTWluaW11bSBGcmVxdWVuY3kiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgICBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuMSwgYWxwaGE9MC45KSArZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RkFMU0UsIGNvbG9yPSJyZWQiLCBhZXMoZ3JvdXA9MSkpCgpncmlkLmFycmFuZ2UoQjEsIEI0LCBucm93ID0gMSkKZ3JpZC5hcnJhbmdlKEIyLCBCMywgbnJvdyA9IDEpCmdyaWQuYXJyYW5nZShCNSwgQjYsIG5yb3cgPSAxKQpgYGAKCiMjIDx1PlN5bGxhYmxlIGlkZW50aWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb246IGxvY2FsaXplZCBhbmQgYnJvYWRseSBkaXNwZXJzZWQgc3lsbGFibGVzPC91PgoKICBUaGUgbmV4dCBzdGVwIHdhcyB0byBleGFtaW5lIGFuZCBkZXNjcmliZSBzeWxsYWJsZSBpZGVudGl0aWVzIGZvciBlYWNoIHN5bGxhYmxlIGZvciBhbGwgc29uZ3MgaW4gdGhlIGRhdGFzZXQuCgogIEVhY2ggc3lsbGFibGUgd2FzIGJpbm5lZCBpbnRvIG9uZSBvZiBzaXggc3lsbGFibGUgZ3JvdXBzOiA8Yj5CdXp6IHN5bGxhYmxlczwvYj4sIDxiPkNvbXBsZXggc3lsbGFibGVzPC9iPiwgPGI+VHJpbGwgc3lsbGFibGVzPC9iPiwgPGI+V2hpc3RsZSBzeWxsYWJsZXM8L2I+LCA8Yj5XaGlzdGxlLWJ1enogc3lsbGFibGVzPC9iPiwgYW5kIDxiPldoaXN0bGUtdHJpbGwgc3lsbGFibGVzPC9iPi4gT25jZSBncm91cGVkIGJ5IHR5cGUsIGVhY2ggc3lsbGFibGUgd2FzIG1lYXN1cmVkIGFuZCBjb21wYXJlZCBieSBzaGFwZSB0byBkZXRlcm1pbmUgaW5kaXZpZHVhbCBpZGVudGl0aWVzIGJhc2VkIG9uIG1vcnBob2xvZ3ksIGR1cmF0aW9uIChzZWMpLCBhbmQgZnJlcXVlbmN5IHJhbmdlIChrSHopLiA8Yj4yMTUgc3lsbGFibGVzPC9iPiB3ZXJlIGRlc2NyaWJlZCB1c2luZyB0aGlzIG1ldGhvZC4gCgogIEkgdXNlZCBhICJtaW5pbXVtIG9jY3VycmVuY2UiIHRocmVzaG9sZCBvZiA8Yj5mb3VyPC9iPiBvY2N1cnJlbmNlcyBvZiBhIHNwZWNpZmljIHN5bGxhYmxlIHdpdGhpbiB0aGUgZGF0YXNldCBmb3IgdGhlIHN5bGxhYmxlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcy4gVGhpcyB3YXMgZG9uZSB0byB3ZWVkIG91dCBwb3NzaWJsZSBvdXRsaWVycyBhbmQgaW1wcm92aXNhdGlvbnMuIFRoZSB0aHJlc2hvbGQgd2FzIGRldGVybWluZWQgYnkgdGFraW5nIGFuIGF2ZXJhZ2Ugb2YgdGhlIG51bWJlciBvZiBzb25ncyByZWNvcmRlZCBhdCBhIGdpdmVuIGxvY2F0aW9uIGFuZCBjb3Jyb2JvcmF0ZWQgdXNpbmcgYSBwb3dlciBhbmFseXNpcy4gT2YgdGhlIDIxNSBkZXNjcmliZWQgaW4gdGhlIGRhdGFzZXQsIDxiPjY3IHN5bGxhYmxlczwvYj4gcGFzc2VkIHRoZSBtaW5pbXVtIG9jY3VycmVuY2UgdGhyZXNob2xkIGFuZCB3ZXJlIHVzZWQgaW4gdGhlIGFuYWx5c2lzLgoKICBJIHRoZW4gcGxvdHRlZCB0aGUgcmVzdWx0aW5nIHN5bGxhYmxlcyBiYXNlZCBvbiB0aGVpciBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLCBhbmQgY29sb3JlZCB0aGVtIGJ5IHRoZSBzdWJzcGVjaWVzIHNvbmcgdGhhdCB0aGUgc3lsbGFibGUgd2FzIHJlY29yZGVkIGluLiBUaGlzIHdhcyBkb25lIHRvIGV4YW1pbmUgaWYgc3lsbGFibGVzIG9jY3VycmVkIGluIGhpZ2hseSBsb2NhbGl6ZWQgaW5zdGFuY2VzLCByZXN0cmljdGVkIGdlb2dyYXBoaWNhbGx5IHRvIGEgc21hbGwgYXJlYSBvciBhIHNpbmdsZSBzdWJzcGVjaWVzLCBvciBpZiB0aGUgc3lsbGFibGVzIHdlcmUgaGlnaGx5IGRpc3BlcnNlZCBhY3Jvc3MgdGhlIGVudGlyZSByYW5nZSBvZiB0aGUgU2Vhc2lkZSBTcGFycm93LgoKICBCZWxvdyBhcmUgZXhhbXBsZXMgb2YgbG9jYWxpemVkIGFuZCBkaXNwZXJzZWQgc3lsbGFibGVzIGZyb20gd2l0aGluIHRoZSBkYXRhIHNldCwgYXMgd2VsbCBhcyBhIGJhciBncmFwaCBzaG93aW5nIHRoZSBwZXJjZW50YWdlIG9mIGxvY2FsaXplZCBhbmQgZGlzcGVyc2VkIHN5bGxhYmxlcyBpbiB0aGUgZGF0YXNldC4gV2UgY2FuIHNlZSBmcm9tIHRoaXMgZ3JhcGggdGhhdCBvbmx5IDxiPn4yNSU8L2I+IG9mIHRoZSBzeWxsYWJsZXMgd2VyZSBsb2NhbGl6ZWQsIHdoaWxlIDxiPn43NSU8L2I+IHdoZXJlIGRpc3BlcnNlZC4gCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ2ZvcnRpZnkpCmxpYnJhcnkocHdyKQoKQmFzaWMubm90ZSA8LSBCYXNpYyAlPiUgc2VsZWN0KDE0OjIyOCkKQmFzaWMubm90ZSAlPiUgY29sU3VtcygpCmNvdW50KEJhc2ljLCB2YXJzID0gQmFzaWMkUmVnaW9uX00pCgpwd3IuYW5vdmEudGVzdChrID0gMzUzLCBmID0gMC4xNSwgc2lnLmxldmVsID0gLjA1LCBwb3dlciA9IC44KQpgYGAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ29tcGxldGVfU1NQIDwtIE11bHRpX3ZhcmlhdGVfcmVkdWNlZAoKc3RhdGVzIDwtIG1hcF9kYXRhKCJzdGF0ZSIpCkNvYXN0X3NldCA8LSBzdWJzZXQoc3RhdGVzLCByZWdpb24gJWluJSBjKCJtYWluZSIsIm5ldyBoYW1wc2hpcmUiLCJtYXNzYWNodXNldHRzIiwiY29ubmVjdGljdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IHlvcmsiLCJuZXcgamVyc2V5IiwiZGVsYXdhcmUiLCJtYXJ5bGFuZCIsInZpcmdpbmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnRoIGNhcm9saW5hIiwic291dGggY2Fyb2xpbmEiLCJnZW9yZ2lhIiwiZmxvcmlkYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGFiYW1hIiwibWlzc2lzc2lwcGkiLCJsb3Vpc2lhbmEiLCJ0ZXhhcyIsInJob2RlIGlzbGFuZCIpKQoKU1NQLmRmLkRpc3AgPC0gQ29tcGxldGVfU1NQICU+JSBzbGljZSg0Njo2MiwgNTQ4OjYwMSwgMTQ1NjoxNDY2KQoKRGlzcC5hbGwgPC0gZ2dwbG90KFNTUC5kZi5EaXNwLCBhZXMoeCA9IExvbmdpdHVkZSwgeSA9IExhdGl0dWRlLCBjb2xvdXIgPSBTdWJzcGVjaWVzKSkgKyBnZ3RpdGxlKCJFeGFtcGxlIG9mIERpc3BlcnNlZCBTeWxsYWJsZXMiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMSkgKyBnZW9tX3BvaW50KHNpemUgPSAwLjEpICsgeGxpbSgtMTEwLC02NSkgKyB5bGltKDI1LDUwKSArIHNjYWxlX2NvbG91cl9kaXNjcmV0ZShkcm9wPVRSVUUsIGxpbWl0cyA9IGxldmVscyhDb21wbGV0ZV9TU1AkU3Vic3BlY2llcykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKyBnZW9tX3BvbHlnb24oZGF0YSA9IENvYXN0X3NldCwgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSArIGNvb3JkX2ZpeGVkKDEuMykgKyBmYWNldF93cmFwKH5TX0lEKQoKRGlzcC5hbGwgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMC41KSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJmaXNoZXJpIiA9ICIjNURDODYzRkYiLCAic2VubmV0dGkiID0gIiNCNERFMkNGRiIsICJqdW5jaWNvbGEiID0gIiM0NDAxNTRGRiIsICJwZW5pbnN1bGFlIiA9ICIjMjE5MDhDRkYiLCAibWFyaXRpbWEiID0gIiMzQjUyOEJGRiIpKQoKIyBOb3RlIENvbXBsZXhlcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKClNTUC5kZi5Mb2NhbCA8LSBDb21wbGV0ZV9TU1AgJT4lIHNsaWNlKGMoNzI3OjczNywgMTA1MzoxMDU4LCA3NDQ6NzU3KSkKCkxvY2FsLmFsbCA8LSBnZ3Bsb3QoU1NQLmRmLkxvY2FsLCBhZXMoeCA9IExvbmdpdHVkZSwgeSA9IExhdGl0dWRlLCBjb2xvdXIgPSBTdWJzcGVjaWVzKSkgKyBnZ3RpdGxlKCJFeGFtcGxlIG9mIExvY2FsaXplZCBTeWxsYWJsZXMiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMSkgKyBnZW9tX3BvaW50KHNpemUgPSAwLjEpICsgeGxpbSgtMTEwLC02NSkgKyB5bGltKDI1LDUwKSArIHNjYWxlX2NvbG91cl9kaXNjcmV0ZShkcm9wPVRSVUUsIGxpbWl0cyA9IGxldmVscyhDb21wbGV0ZV9TU1AkU3Vic3BlY2llcykpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKyAKICBnZW9tX3BvbHlnb24oZGF0YSA9IENvYXN0X3NldCwgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSArIAogIGNvb3JkX2ZpeGVkKDEuMykgKyBmYWNldF93cmFwKH5TX0lEKQoKTG9jYWwuYWxsICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjUsIGhlaWdodCA9IDAuNSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZmlzaGVyaSIgPSAiIzVEQzg2M0ZGIiwgInNlbm5ldHRpIiA9ICIjQjRERTJDRkYiLCAianVuY2ljb2xhIiA9ICIjNDQwMTU0RkYiLCAicGVuaW5zdWxhZSIgPSAiIzIxOTA4Q0ZGIiwgIm1hcml0aW1hIiA9ICIjM0I1MjhCRkYiKSkKCkwuRC5jb3VudCA8LSBsb2NhbF9kaXNwZXJzZWRfY291bnRzCgooZ2dwbG90KEwuRC5jb3VudCwgYWVzKERpc3BlcnNhbCwgZmlsbD1EaXNwZXJzYWwpKQogKyBnZW9tX2JhcigpCiArIGdlb21fdGV4dCgKICAgICBhZXMobGFiZWw9cm91bmQoKC4ucHJvcC4uKSoxMDAsMiksIGdyb3VwPTEpLAogICAgIHN0YXQ9J2NvdW50JywKICAgICBudWRnZV95PTIsCiAgICAgdmE9J2JvdHRvbScsCiAgICAgZm9ybWF0X3N0cmluZz0nezouMWZ9JScKICkKKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkRpc3BlcnNlZCIgPSAiIzNCNTI4QkZGIiwgIkxvY2FsaXplZCIgPSAiIzVEQzg2M0ZGIikpICsgbGFicyh4PSJEaXNwZXJzYWwiLCB5PSJQZXJjZW50YWdlIG9mIFN5bGxhYmxlcyIsIHRpdGxlID0gIlJhdGlvIG9mIERpc3BlcnNlZCBhbmQgTG9jYWxpemVkIFN5bGxhYmxlcyIpKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIyA8dT5Db2FzdGFsIGxpbmVhZ2VzOiBob3cgZG9lcyBjaGFuZ2luZyBwZXJzcGVjdGl2ZSBjaGFuZ2UgdGhlIHN0b3J5PzwvdT4KCiAgRnJvbSB0aGlzIHBvaW50IEkgd2FudGVkIHRvIHNlZSBpZiBhIGJyb2FkZXIgcGF0dGVybiBiZXR0ZXIgZGVzY3JpYmVkIHRoZSBvYnNlcnZhYmxlIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSBzZXQuIFRvIGV4YW1pbmUgdGhpcyBJIHdhbnRlZCB0byBrbm93OiA8Yj5Eb2VzIEdlb2dyYXBoaWMgdmFyaWF0aW9uIGV4aXN0IGJldHdlZW4gdGhlIHR3byBjb2FzdGFsIGxpbmVhZ2VzIG9mIFNlYXNpZGUgU3BhcnJvdyBzdWJzcGVjaWVzPzwvYj4KCiAgRmlyc3QsIEkgcmUtcmFuIG15IGluaXRpYWwgQU5PVkEgdXNpbmcgdGhlIDxiPkF0bGFudGljPC9iPiBhbmQgPGI+R3VsZjwvYj4gcmVnaW9ucyByYXRoZXIgdGhhbiBzdWJzcGVjaWVzIGdyb3VwcyB0byBkZXRlcm1pbmUgaWYgdGhlIHNpZ25pZmljYW5jZSBvZiBteSB2YXJpYWJsZXMgaGFkIGNoYW5nZWQgYmFzZWQgb24gdGhpcyBhbHRlcm5hdGUgbWV0aG9kIG9mIGdyb3VwaW5nIHNvbmdzLiBPbmNlIHNvbmdzIHdlcmUgZ3JvdXBlZCBieSBjb2FzdGFsIGxpbmVhZ2UsIHRoZSBwLXZhbHVlcyBvZiB0aGUgPGI+VGVybWluYWwgQnV6eiBSYXRlPC9iPiBhbmQgPGI+VGVybWluYWwgQnV6eiBNaW5pbXVtIEZyZXF1ZW5jeTwvYj4gd2VyZSBncmVhdGVyIHRoYW4gMC4wNSBhbmQgcmVtb3ZlZCBmb3IgdGhlIG5leHQgYW5hbHlzaXMuIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsbV9iYXNpYzIgPC0gbG0oUmVnaW9uX2NvZGUgfiBTQyArIFRCX0QgKyBJX0QgKyBUQl9QcHMgKyBUQl9NYUYgKyBUQl9NaUYsIGRhdGEgPSBCYXNpYzEpCgphLmxtLmJhc2ljMiA8LSBhbm92YShsbV9iYXNpYzIpCgphLmxtLmJhc2ljMiAlPiUga2FibGUoKSAlPiUga2FibGVfc3R5bGluZygpCmBgYAoKIyMgPHU+Q29hc3RhbCBsaW5lYWdlIHByaW5jaXBsZSBjb21wb25lbnQgYW5hbHlzaXM8L3U+CgogIEkgcmUtY29uc3RydWN0ZWQgdGhlIFBDQSBwbG90IHVzaW5nIHRoZSBjb2FzdGFsIGxpbmVhZ2VzIGFuZCwgd2hpbGUgdGhlcmUgaXMgc3RpbGwgYW4gYXJlYSBvZiBvdmVybGFwLCB0aGVyZSBpcyBhIG11Y2ggY2xlYXJlciBzZXBhcmF0aW9uIGFuZCBjbHVzdGVyaW5nIG9mIGRhdGEgcG9pbnRzIGJldHdlZW4gdGhlIHR3byBncm91cHMuCgogIEFkZGl0aW9uYWxseSwgSSBjb25zdHJ1Y3RlZCBib3hwbG90cyBvZiB0aGUgc2lnbmlmaWNhbnQgdmFyaWFibGVzIHRvIGV4YW1pbmUgaWYgY2xlYXIgc2VwYXJhdGlvbiBleGlzdGVkIGJldHdlZW4gdGhlIHR3byBjb2FzdGFsIGxpbmVhZ2VzIGZvciBlYWNoIHNpZ25pZmljYW50IHZhcmlhYmxlLgoKICBGcm9tIHRoZXNlIGdyYXBocyB3ZSBjYW4gc2VlIHN0cm9uZ2VyIHNlcGFyYXRpb24gYmV0d2VlbiBjb2FzdGFsIGxpbmVhZ2VzIHRoYW4gYmV0d2VlbiBzdWJzcGVjaWVzIGdyb3VwcyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzLiBJbiBwYXJ0aWN1bGFyIHRoZSA8Yj5Ub3RhbCBudW1iZXIgb2YgU3lsbGFibGVzPC9iPiBhbmQgPGI+VGVybWluYWwgQnV6eiBNYXhpbXVtIEZyZXF1ZW5jeTwvYj4gc2hvdyBzdHJvbmcgc2VwYXJhdGlvbi4gCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJhc2ljIDwtIEJhc2ljICU+JSBuYS5vbWl0KCkKQmFzaWNfMyA8LSBCYXNpYyAlPiUgZHBseXI6OnNlbGVjdCg2LDcsMTAsMTIpCgpzc3AucGNhMyA8LSBwcmNvbXAoQmFzaWNfMywgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQoKcGNhLnBsb3QzIDwtIGZ2aXpfcGNhX2JpcGxvdChzc3AucGNhMywgYXhlcyA9IGMoMSwgMiksIGdlb20gPSAicG9pbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBCYXNpYyRSZWdpb25fTSwgYWRkRWxsaXBzZXMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNlLmxldmVsID0gMC45NSkgKyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkF0bGFudGljIiA9ICIjM0I1MjhCRkYiLCAiR3VsZiIgPSAiIzVEQzg2M0ZGIikpCgpwcmludChwY2EucGxvdDMpCgpkaW0xLjEgPC0gZnZpel9jb250cmliKHNzcC5wY2EzLCBjaG9pY2U9InZhciIsIGF4ZXM9MSkrbGFicyh0aXRsZT0iQ29udHJpYnV0aW9ucyB0byBEaW0gMSIpCmRpbTIuMSA8LSBmdml6X2NvbnRyaWIoc3NwLnBjYTMsIGNob2ljZT0idmFyIiwgYXhlcz0yKStsYWJzKHRpdGxlPSJDb250cmlidXRpb25zIHRvIERpbSAyIikKZ3JpZC5hcnJhbmdlKGRpbTEuMSwgZGltMi4xLCBucm93ID0gMSwgdG9wID0gIlZhcmlibGUgV2VpZ2h0cyBXaXRoaW4gUHJpbmNpcGxlIENvbXBvbmVudHMiKQoKYjEgPC0gZ2dwbG90KEJhc2ljLCBhZXMoeD1SZWdpb25fTSwgeT1TQykpICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gQmFzaWMkUmVnaW9uX00pKSArIHRoZW1lX2J3KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgeGxhYigiQ29hc3QgR3JvdXAiKSArIHlsYWIoIlN5bGxhYmxlIENvdW50IikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBdGxhbnRpYyIgPSAiIzNCNTI4QkZGIiwgIkd1bGYiID0gIiM1REM4NjNGRiIpKSArIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC4xLCBhbHBoYT0wLjkpCmIyIDwtIGdncGxvdChCYXNpYywgYWVzKHg9UmVnaW9uX00sIHk9SV9EKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBCYXNpYyRSZWdpb25fTSkpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB4bGFiKCJDb2FzdCBHcm91cCIpICsgeWxhYigiSW50cm9kdWN0b3J5IFBocmFzZSBEdXJhdGlvbiAoc2VjKSIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQXRsYW50aWMiID0gIiMzQjUyOEJGRiIsICJHdWxmIiA9ICIjNURDODYzRkYiKSkgKyBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuMSwgYWxwaGE9MC45KQpiMyA8LSBnZ3Bsb3QoQmFzaWMsIGFlcyh4PVJlZ2lvbl9NLCB5PVRCX0QpKSArIAogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IEJhc2ljJFJlZ2lvbl9NKSkgKyB0aGVtZV9idygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHhsYWIoIkNvYXN0IEdyb3VwIikgKyB5bGFiKCJUZXJtaW5hbCBCdXp6IER1cmF0aW9uIChzZWMpIikgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBdGxhbnRpYyIgPSAiIzNCNTI4QkZGIiwgIkd1bGYiID0gIiM1REM4NjNGRiIpKSArIGdlb21faml0dGVyKGNvbG9yPSJibGFjayIsIHNpemU9MC4xLCBhbHBoYT0wLjkpCmI0IDwtIGdncGxvdChCYXNpYywgYWVzKHg9UmVnaW9uX00sIHk9VEJfTWFGKSkgKyAKICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBCYXNpYyRSZWdpb25fTSkpICsgdGhlbWVfYncoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB4bGFiKCJDb2FzdCBHcm91cCIpICsgeWxhYigiVGVybWluYWwgQnV6eiBNYXhpbXVtIEZyZXF1ZW5jeSAoa0h6KSIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQXRsYW50aWMiID0gIiMzQjUyOEJGRiIsICJHdWxmIiA9ICIjNURDODYzRkYiKSkgKyBnZW9tX2ppdHRlcihjb2xvcj0iYmxhY2siLCBzaXplPTAuMSwgYWxwaGE9MC45KQpncmlkLmFycmFuZ2UoYjEsIGI0LCBucm93ID0gMSwgdG9wID0gIkJveCBQbG90cyBGb3IgU29uZyBDaGFyYWN0ZXJpc3RpY3MgQmV0d2VlbiBHdWxmIGFuZCBBdGxhbnRpYyBHcm91cHMiKSAKZ3JpZC5hcnJhbmdlKGIyLCBiMywgbnJvdyA9IDEsIHRvcCA9ICJCb3ggUGxvdHMgRm9yIFNvbmcgQ2hhcmFjdGVyaXN0aWNzIEJldHdlZW4gR3VsZiBhbmQgQXRsYW50aWMgR3JvdXBzIikgCmBgYAoKIyMgPHU+U3lsbGFibGUgYWNjdW11bGF0aW9uPC91PiAKCiAgRmluYWxseSwgSSB3YW50ZWQgdG8gbG9vayBhdCB0aGUgdG90YWwgYWNjdW11bGF0aW9uIG9mIHN5bGxhYmxlcyBkZXRlcm1pbmUgaWYgdGhlIDIxNSBkZXNjcmliZWQgc3lsbGFibGVzIGZyb20gbXkgZGF0YSBzZXQgYXJlIGEgcmVwcmVzZW50YXRpdmUgc2FtcGxpbmcgb2Ygc29uZ3MgZnJvbSB0aHJvdWdob3V0IHRoZSByYW5nZS4gSW4gYWRkaXRpb24sIEkgd2FudGVkIHRvIGNvbXBhcmUgdGhlIHJhdGUgb2Ygc3lsbGFibGUgYWNjdW11bGF0aW9uIGJldHdlZW4gdGhlIHR3byBjb2FzdGFsIGxpbmVhZ2VzLiAKCiAgVG8gZG8gdGhpcyBJIGNvbnN0cnVjdGVkIGFuIGFjY3VtdWxhdGlvbiBjdXJ2ZSBvZiBzeWxsYWJsZXMgZm9yIHRoZSBlbnRpcmUgZGF0YSBzZXQgYW5kIG92ZXJsYWlkIGl0IHdpdGggYW4gYWRkaXRpb25hbCBjdXJ2ZSBmb3IgZWFjaCBjb2FzdGFsIGxpbmVhZ2UuCgogIFdoYXQgdGhpcyBzaG93cyBpcyBhbiBvdmVyYWxsIGFjY3VtdWxhdGlvbiBjdXJ2ZSB0aGF0IGhhcyBub3QgbGV2ZWxlZCBvZmYuIHRoaXMgaW5kaWNhdGVzIHRoYXQgbW9yZSBzb25nIHNhbXBsaW5nIHdvdWxkIGxpa2VseSB5aWVsZCBhZGRpdGlvbmFsIHN5bGxhYmxlcyB0aHJvdWdob3V0IHRoZSBzcGVjaWVzIHJhbmdlLiBBZGRpdGlvbmFsbHkgd2Ugc2VlIHRoYXQgdGhlIEF0bGFudGljIGxpbmVhZ2UgYWNjcnVlcyBtb3JlIHN5bGxhYmxlcyB0aGFuIHRoZSBHdWxmIGxpbmVhZ2UgYXQgZXF1YWwgcG9pbnRzIG9uIHRoZSBncmFwaC4gVGhlIEF0bGFudGljIGxpbmVhZ2UgYWxzbyBjb250YWlucyBuZWFybHkgYXMgbWFueSBzeWxsYWJsZXMgYXMgdGhlIEd1bGYuIFRoZXNlIGZpbmRpbmdzIGFyZSBpbnRlcmVzdGluZyBnaXZlbiB0aGF0IHRoZSBHdWxmIGxpbmVhZ2UgaGFkIGEgaGlnaGVyIG51bWJlciBvZiBzeWxsYWJsZXMgcGVyIHNvbmcuIFRoaXMgd291bGQgaW5kaWNhdGUgdGhhdCB0aGUgR3VsZiBsaW5lYWdlIHNvbmdzIGhhdmUgYSBoaWdoZXIgb2NjdXJyZW5jZSBvZiByZXBlYXQgc3lsbGFibGVzIGluIGVhY2ggc29uZy4gCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodmVnYW4pCmxpYnJhcnkocmVhZHhsKQoKc2FjX1NTUCA8LSBTeWxsYWJsZV9hY2N1bQp0b3RhbC5zeWxsYWJsZXMgPC0gc3BlY2FjY3VtKHNhY19TU1AsIG1ldGhvZCA9ICJyYW5kb20iLCBwZXJtdXRhdGlvbnMgPSAxMDAwLCBjb25kaXRpb25lZCA9VFJVRSwgZ2FtbWEgPSAiamFjazEiLCAgdyA9IE5VTEwpCgoKI3N1YnNldCBlYWNoIGhhYml0YXQgaW50byBpdHMgb3duIGRmCnNhY19TU1AgJT4lIGZpbHRlcihSZWdpb25fTSA9PSAxKSAtPiBBdGxhbnRpYwpzYWNfU1NQICU+JSBmaWx0ZXIoUmVnaW9uX00gPT0gMikgLT4gR3VsZgoKI2NhbGMgc3BlY2llcyBhY2N1bXVsYXRpb24gY3VydmUgZm9yIGVhY2ggaGFiaXRhdApBdGxhbnRpYy5jb2FzdCA9IHNwZWNhY2N1bShBdGxhbnRpYywgbWV0aG9kID0gInJhbmRvbSIsIHBlcm11dGF0aW9ucyA9IDEwMDApCkd1bGYuY29hc3QgPSBzcGVjYWNjdW0oR3VsZiwgbWV0aG9kID0gInJhbmRvbSIsIHBlcm11dGF0aW9ucyA9IDEwMDApCgojcGxvdCBjdXJ2ZV9hbGwgZmlyc3QKcGxvdCh0b3RhbC5zeWxsYWJsZXMsIHhsYWIgPSAiTnVtYmVyIG9mIHNvbmdzIGFuYWx5emVkIiwgeWxhYiA9ICJOdW1iZXIgb2Ygc3lsbGFibGVzIiwgbWFpbiA9ICJTeWxsYWJsZSBBY2N1bXVsYXRpb24gQ3VydmUiLCBjb2wgPSAiZ3JheSIpIAojdGhlbiBwbG90IHRoZSByZXN0CnBsb3QoQXRsYW50aWMuY29hc3QsIGFkZCA9IFRSVUUsIGNvbCA9ICIjM0I1MjhCRkYiKSAKcGxvdChHdWxmLmNvYXN0LCBhZGQgPSBUUlVFLCBjb2wgPSAiIzVEQzg2M0ZGIikKbGVnZW5kKCJib3R0b21yaWdodCIsIGMoIlRvdGFsIFN5bGxhYmxlcyIsICJBdGxhbnRpYyIsICJHdWxmIiksY29sPWMoImJsYWNrIiwiIzNCNTI4QkZGIiwiIzVEQzg2M0ZGIiksbHR5PTEsYnR5PSduJyxpbnNldD0wLjAyNSkKYGBgCgoKCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgoKCgo=